package org.example.top40;

import java.util.ArrayList;
import java.util.List;

public class main23 {
    //螺旋矩阵
    //输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
    //输出：[1,2,3,6,9,8,7,4,5]
    //思路：需要x，y当初始位置 loop=Math.min(m,n)/2为要几圈用于while条件
    //index控制在第几环
    //后两个for不用给i，j赋值 能自增
    //最后是奇数需判断最后一行左闭右闭区间 行数小于列数 横着要j 反之要i
    //注意i，j只能在for中自增或自减
    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };
        List<Integer> res = spiralOrder(matrix);
        System.out.println(res);
    }

    private static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        int x = 0, y = 0;
        int i, j;
        int index = 1;
        int loop = Math.min(m, n) / 2;
        while ((loop--) != 0) {
            for (j = y; j < n - index; j++) res.add(matrix[x][j]);
            for (i = x; i < m - index; i++) res.add(matrix[i][j]);
            for (; j > y; j--) res.add(matrix[i][j]);
            for (; i > x; i--) res.add(matrix[i][j]);
            x++;
            y++;
            index++;
        }
        if(Math.min(m,n)%2==1){
            if(m<=n){
                //这里的小于等于本质上是左闭右闭区间，和前面的左闭右开不一样！！！
                for(j=y;j<=n-index;j++) res.add(matrix[x][j]);
            }else {
                for (i=x;i<=m-index;i++) res.add(matrix[i][y]);
            }
        }
        return res;
    }
}
